<?php

namespace DatMoment\VideoBundle\Metier\Operations;

use DatMoment\VideoBundle\Entity\Video;
use Symfony\Component\Security\Core\Exception;

class VideoOperations {
    private $video;
    private $entityManager;
    private $videoRepository;
    
    public function __construct($pentityManager) {
        $this->entityManager = $pentityManager;
        $this->videoRepository = $this->entityManager->getRepository('DatMomentVideoBundle:Video');
    }
    
    public function createVideoEmpty() {
        $this->video = new Video();
    }
    /**
     * @param type $pidVideo
     * @param type $ptitre
     * @param type $ptype
     * @param type $pdescription
     * @param type $pimg
     * @param type $pcode
     * @param type $pcategorie, c'est le getName()
     * @param type $puser
     * @param type $pjeux, optionnal, c'est un String
     */
    public function createVideo($pidVideo, $ptitre, $ptype, $pdescription, $pimg, $purl, $pcode, $pcategorie, $puser, $pjeux = null) {
        $categorieOperations = new CategorieOperations($this->entityManager);
        $jeuxOperations = new JeuxOperations($this->entityManager);
        
        $this->video = new Video();
        $this->video->setIdVideo($pidVideo);
        $this->video->setTitre($ptitre);
        $this->video->setType($ptype);
        $this->video->setDescription($pdescription);
        $this->video->setImg($pimg);
        $this->video->setUrl($purl);
        $this->video->setCode($pcode);
        $this->video->setUser($puser);
        $this->video->setCategorie($categorieOperations->findOneByName($pcategorie));
   
        if ($pjeux != null) {
            $this->video->setJeux($jeuxOperations->findOneByName($pjeux));
        }
    }
    
    public function getVideo() {
        return $this->video;
    }
    
    public function initialisationVideo($pvideo) {
        $this->categorie = $pvideo;
    }
    
    /**
     * @param Video $pvideo
     * @return string
     */
    public function getCategoriesString($pvideo) {
        $listCategories = $pvideo->getCategories();
        $categoriesString = "";
        $first = true;
        foreach ($listCategories as $categorie) {
            if ($first) {
                $categoriesString .= $categorie->getName();
                $first = false;
            }
            else {
                $categoriesString .= " , " .$categorie->getName(); 
            }
        }
        return $categoriesString;
    }
    
    public function getVideosByPage($pnbVideos, $page) {
        $offset = ($page-1) * $pnbVideos;
        
        $listVideos = $this->videoRepository->findBy(
               array(),       // Critères clause Where en array
               array('dateAdd' => 'desc'),       // Array de OrderBy
               $pnbVideos,                      // Limit, nombre de récupérations
               $offset);                       // Offset, à partir de quand on recup si 0 au début
        
        return $listVideos;
    }
    
    public function getVideosByCategory($pnbVideos, $pnomCategorie, $page) {
        $offset = ($page-1) * $pnbVideos;
        
        $categoryOP = new CategorieOperations($this->entityManager);
        $idCategorie = $categoryOP->findOneByName($pnomCategorie);
        
        $listVideos = $this->videoRepository->findBy(
               array('categorie' => $idCategorie),       // Critères clause Where en array
               array('dateAdd' => 'desc'),       // Array de OrderBy
               $pnbVideos,                      // Limit, nombre de récupérations
               $offset);                       // Offset, à partir de quand on recup si 0 au début
        
        return $listVideos;
    }
    
    public function getVideosByGame($pnbVideos, $pnomGame, $page) {
        $offset = ($page-1) * $pnbVideos;
        
        $categoryOP = new JeuxOperations($this->entityManager);
        $idGame = $categoryOP->findOneByName($pnomGame);
        
        $listVideos = $this->videoRepository->findBy(
               array('jeux' => $idGame),       // Critères clause Where en array
               array('dateAdd' => 'desc'),       // Array de OrderBy
               $pnbVideos,                      // Limit, nombre de récupérations
               $offset);                       // Offset, à partir de quand on recup si 0 au début
        
        return $listVideos;
    }
    
    public function getNbVideos() {
          $listVideos = $this->videoRepository->getNbVideos();
          return ($listVideos);
    }
    
    public function checkIdVideo($pidVideo) {
       $listVideos = $this->videoRepository->findBy(
               array('idVideo' => $pidVideo),       // Critères clause Where en array
               array(),                             // Array de OrderBy
               null,                                // Limit, nombre de récupérations
               null);                               // Offset, à partir de quand on recup si 0 au début
        
        return $listVideos;
    }
    
    public function getVideoByIdVIdeo($pidVideo) {
        $video = $this->videoRepository->findOneBy(array('idVideo' => $pidVideo));
        return $video;
    }
    
    public function getVideoById($pid) {
        $video = $this->videoRepository->findOneBy(array('id' => $pid));
        return $video;
    }
    
    
    public function persist() {
        if ($this->video != null) {
            $this->entityManager->persist($this->video);
            $this->entityManager->flush();
        }
        else {
            throw new Exception\InvalidArgumentException("VideoOperations.php : L'objet est mal renseigné et n'a pas pu être persisté");
        }
    }
}

?>
